package cn.lg.soar.common.util.asserts;

import cn.lg.soar.common.data.msg.I18n;
import cn.lg.soar.common.util.data.DataUtil;

import java.util.Collection;
import java.util.Map;
import java.util.Objects;

/**
 * @author luguoxiang
 * @date 2022/3/29
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IAssert {

    /**
     * 断言两个值相等，否则抛异常
     * @param a
     * @param b
     * @param message
     * @param args
     */
    default void equals(Object a, Object b, I18n message, Object...args) {
        if (!Objects.equals(a, b)) {
            throwException(message, args);
        }
    }

    /**
     * 断言两个值相等，否则抛异常
     * @param a
     * @param b
     * @param message
     * @param args
     */
    default void equals(Object a, Object b, String message, Object...args) {
        if (!Objects.equals(a, b)) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果为真，否则抛异常
     * @param b
     * @param message
     * @param args
     */
    default void isTrue(Boolean b, I18n message, Object...args) {
        if (!Boolean.TRUE.equals(b)) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果为真，否则抛异常
     * @param b
     * @param message
     * @param args
     */
    default void isTrue(Boolean b, String message, Object...args) {
        if (!Boolean.TRUE.equals(b)) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果为假，否则抛异常
     * @param b
     * @param message
     * @param args
     */
    default void isFalse(Boolean b, I18n message, Object...args) {
        if (!Boolean.FALSE.equals(b)) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果为假，否则抛异常
     * @param b
     * @param message
     * @param args
     */
    default void isFalse(Boolean b, String message, Object...args) {
        if (!Boolean.FALSE.equals(b)) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不能为null，否则抛异常
     * @param o
     * @param message
     * @param args
     */
    default void notNull(Object o, I18n message, Object...args) {
        if (o == null) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不能为null，否则抛异常
     * @param o
     * @param message
     * @param args
     */
    default void notNull(Object o, String message, Object...args) {
        if (o == null) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param collection
     * @param message
     * @param args
     */
    default void notEmpty(Collection<?> collection, I18n message, Object...args) {
        if (collection == null || collection.isEmpty()) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param collection
     * @param message
     * @param args
     */
    default void notEmpty(Collection<?> collection, String message, Object...args) {
        if (collection == null || collection.isEmpty()) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param map
     * @param message
     * @param args
     */
    default void notEmpty(Map<?, ?> map, I18n message, Object...args) {
        if (map == null || map.isEmpty()) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param map
     * @param message
     * @param args
     */
    default void notEmpty(Map<?, ?> map, String message, Object...args) {
        if (map == null || map.isEmpty()) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param array
     * @param message
     * @param args
     */
    default void notEmpty(Object[] array, I18n message, Object...args) {
        if (array == null || array.length == 0) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param array
     * @param message
     * @param args
     */
    default void notEmpty(Object[] array, String message, Object...args) {
        if (array == null || array.length == 0) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param string
     * @param message
     * @param args
     */
    default void notEmpty(CharSequence string, I18n message, Object...args) {
        if (string == null || string.length() == 0) {
            throwException(message, args);
        }
    }

    /**
     * 断言结果不是空，否则抛异常
     * @param string
     * @param message
     * @param args
     */
    default void notEmpty(CharSequence string, String message, Object...args) {
        if (string == null || string.length() == 0) {
            throwException(message, args);
        }
    }

    /**
     * 非空
     * @param o
     * @param message
     * @param args
     */
    default void notEmpty(Object o, I18n message, Object...args) {
        if (DataUtil.isValuable(o)) {
            return;
        }
        throwException(message, args);
    }

    /**
     * 非空
     * @param o
     * @param message
     * @param args
     */
    default void notEmpty(Object o, String message, Object...args) {
        if (DataUtil.isValuable(o)) {
            return;
        }
        throwException(message, args);
    }

    /**
     * 直接抛异常
     * @param message
     * @param args
     */
    void throwException(I18n message, Object...args);

    /**
     * 直接抛异常
     * @param message
     * @param args
     */
    default void throwException(String message, Object...args) {
        throwException(I18n.build(message), args);
    }

}
